package kr.pe.johnkim.sendme.activity;

import java.util.ArrayList;
import java.util.List;

import org.json.JSONArray;
import org.json.JSONObject;

import kr.pe.johnkim.sendme.provider.SendMeBlock;
import kr.pe.johnkim.sendme.provider.SendMeDownloadMessageAdapter;
import kr.pe.johnkim.sendme.provider.SendMeFriend;
import kr.pe.johnkim.sendme.provider.SendMeInstall;
import kr.pe.johnkim.sendme.provider.SendMeLog;
import kr.pe.johnkim.sendme.provider.SendMeReservationMessageAdapter;
import kr.pe.johnkim.sendme.provider.SendMeReservationMessageGroupEditAdapter;
import kr.pe.johnkim.sendme.provider.SendMeUser;
import kr.pe.johnkim.sendme.provider.SendMeVoice;
import kr.pe.johnkim.sendme.rest.SendMeAudioMessageRest;
import kr.pe.johnkim.sendme.rest.SendMeBlockRest;
import kr.pe.johnkim.sendme.rest.SendMeInstallRest;
import kr.pe.johnkim.sendme.rest.SendMeLogRest;
import kr.pe.johnkim.sendme.rest.SendMeUserRest;
import kr.pe.johnkim.sendme.util.SendMeActivityManager;
import kr.pe.johnkim.sendme.util.SendMeCommon;
import kr.pe.johnkim.sendme.util.SendMeConstant;
import kr.pe.johnkim.sendme.util.SendMeDBManagerAudioRecord;
import kr.pe.johnkim.sendme.util.SendMeDBManagerInstallUser;
import kr.pe.johnkim.sendme.util.SwipeListViewActivity;
import android.app.Activity;
import android.app.AlertDialog;
import android.app.ListActivity;
import android.app.ProgressDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.SharedPreferences;
import android.database.Cursor;
import android.net.Uri;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.provider.ContactsContract;
import android.text.Editable;
import android.text.TextWatcher;
import android.util.Log;
import android.view.Gravity;
import android.view.Menu;
import android.view.View;
import android.view.Window;
import android.view.View.OnClickListener;
import android.widget.AbsListView;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ImageButton;
import android.widget.ListAdapter;
import android.widget.ListView;
import android.widget.Toast;
import android.widget.AbsListView.OnScrollListener;

/**
 * 예약 전송 음성 메시지 목록 액티비티 클래스이다.
 * @author blue
 *
 */
public class SendMeReservationMessageListActivity extends SwipeListViewActivity implements OnScrollListener {

	public static String TAG = SendMeReservationMessageListActivity.class.getSimpleName();

	// 액티비티 매니저를 가져 온다.
	private SendMeActivityManager sendMeActivityManager = SendMeActivityManager.getInstance();

	// 마스터 암호.
	private String MASTER_PASSWORD = "";

	// 퍼블릭 암호.
	private String PUBLIC_PASSWORD = "";

	// 기능 모드.(MASTER/PUBLIC)
	private String FUNCTION_MODE = "";

	// 사용자 휴대 전화번호.
	private String PHONE_NUMBER = "";

	
	
	// 리스트에서 클릭한 버튼이 위치한 포지션
	int selectedPosition;
	// 리스트에서 선택한 항목
	SendMeVoice selectedItem;

	/*
	 * 예약 메시지 관련
	 */
	// 음성 메시지 어댑터 클래스.
	private SendMeReservationMessageAdapter sendMeReservationMessageAdapter;		

	// 메시지 목록
	private ArrayList<SendMeVoice> reservationMessageList = null;		
	public ArrayList<SendMeVoice> reservationMessageListFiltered = null;		

	// 리스트 없음 표시
	View emptyListView;
	ListView listViewReservationMessage;
	
	ImageButton imageButtonTopBack;
	ImageButton imageButtonTopMainMenu;

	
	/*
	 *  그룹원 편집기능.
	 */
	// 그룹원 체크하고나서 삭제할때 버튼
	Button groupEditDeleteBtn;
	public boolean groupEditMode = false;
	String selectedMessageIdSendMeVoice;
	// 그룹원 어댑터 클래스.
	private SendMeReservationMessageGroupEditAdapter reservationMessageGroupEditAdapter;
	// 그룹원 목록
	private ArrayList<SendMeFriend> groupEditFriendList = null;
	// 그룹원 리스트를 뿌려줄 뷰
	ListView listViewReservationMessageGroupEdit;		 
	// 보여주기 레이아웃. 그룹원 리스트
	View listViewReservationMessageGroupEditLayout;
	
	// 프로그래스바(로딩 표시)
	private ProgressDialog dialog;
	

	
	// 로그를 남긴다
	private static final int THREAD_REGISTER_LOG = 100;
	
	// 앱을 종료 한다.
	private static final int ALERT_DIALOG_EXIT_ID = 101;

	// 서버에서 받은 메시지 목록을 조회한다
	private static final int THREAD_SELECT_RECEIVE_MESSAGE_LIST = 102;		

	// 조회한 리스트를 화면에 세팅한다
	private static final int THREAD_SHOW_RESERVATION_MESSAGE_LIST = 103;

	// 프로그레스 바를 출력 한다.
	private static final int THREAD_PROGRESS_BAR_VISIBLE = 105;

	// 프로그레스 바를 감춘다.
	private static final int THREAD_PROGRESS_BAR_INVISIBLE = 106;

	
	// 음성 메시지 전송전 확인 창을 띄운다				
	private static final int THREAD_CONFIRM_SEND_AUDIO = 113;

	// 등록 성공 토스트를 띄운다
	private static final int THREAD_TOAST_SEND_SUCCESS = 110;
	
	// 등록 실패 토스트를 띄운다
	private static final int THREAD_TOAST_SEND_FAIL = 112;		
	
	
	// 삭제 전 확인 창을 띄운다
	private static final int THREAD_CONFIRM_DELETE = 126;		
	
	// 삭제 성공 토스트를 띄운다
	private static final int THREAD_TOAST_RECEIVE_DELETE_SUCCESS = 116;			
	
	// 삭제 실패 토스트를 띄운다
	private static final int THREAD_TOAST_RECEIVE_DELETE_FAIL = 118;		
	
	// 예약 메시지 그룹원 목록을 조회한다.
	private static final int THREAD_SELECT_USER_LIST = 131;		
	
	// 예약 메시지 그룹원 목록을 출력 한다.		
	private static final int THREAD_SHOW_RESERVATION_MESSAGE_GROUP_EDIT_LIST  = 132;
	
	// 예약 메시지 그룹원 목록을 숨긴다
	private static final int THREAD_HIDE_RESERVATION_MESSAGE_GROUP_EDIT_LIST  = 134; 
	
	// 예약 메시지 그룹원 목록을 수정한다		updateReservationUserList
	private static final int THREAD_UPDATE_RESERVATION_USER_LIST  = 133; 
	
	// 그룹원 전체 삭제불가 알림창을 띄운다	
	private static final int  THREAD_CAN_NOT_DELETE_GROUP_ALL = 127;
	

	
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
	
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);

		// 커스텀 타이블 바를 설정 한다.
		Window window = getWindow();
		window.requestFeature(Window.FEATURE_CUSTOM_TITLE);

		setContentView(R.layout.activity_send_me_reservation_message_list);

		window.setFeatureInt(Window.FEATURE_CUSTOM_TITLE, R.layout.custom_title_bar_03);

		// 액티비티 매니저에 담는다.
		sendMeActivityManager.addActivity(this);

		// 설정파일을 가져 온다.
		this.confirmNotification();

		listViewReservationMessage = (ListView) findViewById(R.id.listViewReservationMessage);

		listViewReservationMessageGroupEdit  = (ListView) findViewById(R.id.list_view_reservation_message_group_edit);
		listViewReservationMessageGroupEditLayout = findViewById(R.id.list_view_reservation_message_group_edit_layout);
		
		// 뒤로 가기 화살표 버튼을 설정 한다.
		imageButtonTopBack = (ImageButton)findViewById(R.id.imageButtonTopBack);
		imageButtonTopBack.setOnClickListener(new View.OnClickListener() {

			@Override
			public void onClick(View v) {
				// TODO Auto-generated method stub

				// 화면을 닫는다.
				sendMeActivityManager.removeActivity(SendMeReservationMessageListActivity.this);
				finish();
			}
		});

		// 타이틀바의 메인 메뉴 버튼을 설정 한다.
		imageButtonTopMainMenu = (ImageButton)findViewById(R.id.imageButtonTopMainMenu);
		imageButtonTopMainMenu.setOnClickListener(new OnClickListener() {

			@Override
			public void onClick(View v) {
				// TODO Auto-generated method stub
				Log.i(TAG, "pressed top main menu.");

				// 메인 메뉴 화면을 출력 한다.
				Intent i = new Intent(SendMeReservationMessageListActivity.this, SendMeMainMenuActivity.class);
				startActivity(i);
				
				// 화면을 닫는다.
				sendMeActivityManager.removeActivity(SendMeReservationMessageListActivity.this);
				finish();
			}
		});
		
		
		
		// 그룹원 삭제 버튼을 설정한다
		groupEditDeleteBtn = (Button)findViewById(R.id.group_edit_delete_btn);
		groupEditDeleteBtn.setOnClickListener(new OnClickListener() {
					
			@Override
			public void onClick(View v) {
				// TODO Auto-generated method stub
				Log.i(TAG, "groupEditDeleteBtn onClick");
				
				boolean deleteAvailable = false;		// 삭제 가능 여부 초기화. 전체 삭제 방지를 위함
				
				for(int i=0; i<groupEditFriendList.size(); i++){
					if(!(groupEditFriendList.get(i).getIsSelectedForSend())){	// 삭제모
						deleteAvailable = true;
					}
				}
				
				
				if(deleteAvailable){
					
					mHandler.sendMessage(mHandler.obtainMessage(THREAD_UPDATE_RESERVATION_USER_LIST));
//					/*
//					 * 이런식으로 보냄
//					 */
//					ArrayList<SendMeFriend> phoneBookAddress = sendMeCommon.selectPhoneBookAddress(returnThis());  
//					
//					sendMeInstallList = new ArrayList<SendMeInstall>();
//					String nowTime = sendMeCommon.getCurrentDate();
//					
//					for(int i=0; i<phoneBookAddress.size(); i++){
//						
//						SendMeInstall sendMeInstall = new SendMeInstall();
//						sendMeInstall.setPhoneNumber(phoneBookAddress.get(i).getPhoneNumber());
//						sendMeInstall.setActivateYn("Y");
//						sendMeInstall.setModifyDate(nowTime);
//						sendMeInstall.setRegisterDate(nowTime);
//						sendMeInstall.setSendMeMemberPhoneNumber(PHONE_NUMBER);
//
//						sendMeInstallList.add(sendMeInstall);
//
//					}
//					SendMeInstallRest sendMeInstallRest = new SendMeInstallRest();
//					sendMeInstallRest.updateInstall(sendMeInstallList);		// 테스트를 위해 잠시 주석 ### 
					
				}else{
					
					for(int i=0; i<groupEditFriendList.size(); i++){
						groupEditFriendList.get(i).setSelectedForSend(false);	
					}
					reservationMessageGroupEditAdapter.notifyDataSetChanged();
					
					mHandler.sendMessage(mHandler.obtainMessage(THREAD_CAN_NOT_DELETE_GROUP_ALL));
				}
			}
		});
		
		

		// 화면 출력을 위한 목록을 생성 한다.
		reservationMessageList = new ArrayList<SendMeVoice>();

		//  어댑터를 생성 한다.
		sendMeReservationMessageAdapter = new SendMeReservationMessageAdapter(getApplicationContext(), this, reservationMessageList);

		// 리스트 없음 표시
		emptyListView = findViewById(R.id.emptyListView);
		
		// list view 의 cursor 를 제공하기 위해서 어댑터를 세팅 한다.
		reservationMessageListFiltered = reservationMessageList;		// 미리 복사
		getListView().setAdapter(sendMeReservationMessageAdapter);

		// 스크롤 이벤트 리스너를 등록 한다.
		getListView().setOnScrollListener(this);

		// list 레이아웃 그리기 캐쉬를 설정 한다.
		getListView().setAlwaysDrawnWithCacheEnabled (true);

		
		// 로깅.
		mHandler.sendMessage(mHandler.obtainMessage(THREAD_REGISTER_LOG));
		
		
	}
	
	
	@Override
	public boolean onCreateOptionsMenu(Menu menu) {
		// Inflate the menu; this adds items to the action bar if it is present.
		getMenuInflater().inflate(R.menu.send_me_friend, menu);
		return true;
	}

	/**
	 * 필요한 핸들러를 등록해서 사용한다.
	 */
	private Handler mHandler = new Handler() {
		@Override
		public void handleMessage(Message msg) {
			switch(msg.what) {
			
			// 로그를 남긴다
			case THREAD_REGISTER_LOG : 
				threadRegisterLog();
				break;
			case ALERT_DIALOG_EXIT_ID : 
				break;
				// 예약 메시지 목록을 세팅
			case THREAD_SELECT_RECEIVE_MESSAGE_LIST : 
				threadSelectUserReservationList();
				break;
				// 예약 메시지 목록을 출력 한다.		
			case THREAD_SHOW_RESERVATION_MESSAGE_LIST : 
				runOnUiThread(showReservationMessageList);
				break;
				
				// 예약 메시지 그룹원 목록을 조회한다.
			case THREAD_SELECT_USER_LIST :
				threadSelectUserList();		// ### 
			break;	
				// 예약 메시지 그룹원 목록을 출력 한다.		
			case THREAD_SHOW_RESERVATION_MESSAGE_GROUP_EDIT_LIST : 
				runOnUiThread(showReservationMessageGroupEditList);
				break;		
				// 예약 메시지 그룹원 목록을 숨긴다	
			case THREAD_HIDE_RESERVATION_MESSAGE_GROUP_EDIT_LIST : 
				runOnUiThread(hideReservationMessageGroupEditList);
				break;		
				// 예약 음성 메시지의 수신자 목록을 업데이트 한다.	
			case THREAD_UPDATE_RESERVATION_USER_LIST : 
				threadUpdateReservationUserList();
				break;	
				
				// 프로그레스 바를 출력 한다.
			case THREAD_PROGRESS_BAR_VISIBLE : 
					dialog.show();
				break;
				// 프로그레스 바를 감춘다.
			case THREAD_PROGRESS_BAR_INVISIBLE : 
				dialog.hide();
				break;
				
				// (서버 통신) 전송 확인 창을 띄운다
			case THREAD_CONFIRM_SEND_AUDIO : 
				runOnUiThread(confirmSendReservationMessage);
				break;
				
				// (서버 통신) 전송 성공 토스트를 띄운다	
			case THREAD_TOAST_SEND_SUCCESS : 
				showToastAudioSendSuccess();		
				break;	
				
				// (서버 통신) 전송 실패 토스트를 띄운다
			case THREAD_TOAST_SEND_FAIL :
				showToastAudioSendFail();
				break;	
				
				// 음성 메시지를 삭제 성공 토스트를 띄운다		THREAD_CONFIRM_DELETE			
			case THREAD_TOAST_RECEIVE_DELETE_SUCCESS :		
				showToastAudioDeleteSuccess();
				break;	
				// 음성 메시지를 삭제 실패 토스트를 띄운다
			case THREAD_TOAST_RECEIVE_DELETE_FAIL :
				showToastAudioDeleteFail();
				break;	
				
				// 음성 메시지 삭제전 확인 창을 띄운다		
			case THREAD_CONFIRM_DELETE : 
				runOnUiThread(confirmDeleteAudio);				
				break;
				
				// 그룹원 전체 삭제불가 알림창을 띄운다	
			case THREAD_CAN_NOT_DELETE_GROUP_ALL : 
				runOnUiThread(confirmCanNotDeleteGroupAll);				
				break;
			}
		}
	};


	/**
	 * 목록을 세팅해서 출력 한다.
	 */
	private Runnable showReservationMessageList = new Runnable() {

		@Override
		public void run() {
			// TODO Auto-generated method stub
			
			if(reservationMessageList!=null){
				sendMeReservationMessageAdapter = new SendMeReservationMessageAdapter(returnThis(), SendMeReservationMessageListActivity.this, reservationMessageList);
				reservationMessageListFiltered = reservationMessageList;		// 미리 복사
				getListView().setAdapter(sendMeReservationMessageAdapter);
			}
			
			if(reservationMessageList.size()>0){
				emptyListView.setVisibility(View.GONE);
			}else{
				emptyListView.setVisibility(View.VISIBLE);
			}
			
			

		}
	};

	
	
	/**
	 * 그룹편집을 위해 터치시 그룹원 목록을 조회한다.
	 */
	public void processReservationMessageGroupEditList(String idSendMeVoice, int idx){

		SendMeCommon sendMeCommon = new SendMeCommon();

//		// 그룹 터치시 해당 그룹에서 조회.
//		groupEditFriendList = new ArrayList<SendMeFriend>();

		//바로 idSendMeVoice 를 가지고 그룹원들을 조회한다.
		selectedMessageIdSendMeVoice = idSendMeVoice;
		mHandler.sendMessage(mHandler.obtainMessage(THREAD_SELECT_USER_LIST));		// ### 
		

		
//		// 그리고 출력한다
//		
//		// 수정 쪽은 이후 처리
//		
//		
//		String receiversGroupStr = reservationMessageList.get(selectedPosition).getReceiver();
//
//		
//		
//		
//		
//		
//		
//		
//		String[] receivers = sendMeCommon.convertStringToArray(receiversGroupStr);
//
//		for(int i=0; i<receivers.length; i++){
//			SendMeFriend sendMeFriend = new SendMeFriend();
//
//			sendMeFriend.setSelectedForSend(false);						// 체크안되어 있음
//			sendMeFriend.setPhoneNumber(receivers[i]);					// 전번 세팅
//			sendMeFriend.setName(sendMeCommon.selectFriendNameByPhoneNumber(returnThis(), receivers[i]));	// 이름 세팅
//
//			groupEditFriendList.add(sendMeFriend);
//		}
//
//		// 작업이 끝났다면 화면에 세팅하는 메소드를 호출
//		Log.d(TAG,"produce group edit list end. call show group edit list method.");
//		mHandler.sendMessage(mHandler.obtainMessage(THREAD_SHOW_RESERVATION_MESSAGE_GROUP_EDIT_LIST));

	}
	
	/**
	 * 그룹원 목록을 세팅해서 출력 한다.
	 */
	private Runnable showReservationMessageGroupEditList = new Runnable() {
		
		@Override
		public void run() {
//			Log.d(TAG,"showReservationMessageGroupEditList. groupEditFriendList:"+groupEditFriendList.size());
			if(groupEditFriendList!=null && groupEditFriendList.size()>0){
				reservationMessageGroupEditAdapter = new SendMeReservationMessageGroupEditAdapter(returnThis(), groupEditFriendList);
				listViewReservationMessageGroupEdit.setAdapter(reservationMessageGroupEditAdapter);
				
				listViewReservationMessageGroupEditLayout.setVisibility(View.VISIBLE);
				groupEditMode = true;
			}
		}
	};
	
	/*
	 * 그룹원 목록 숨김
	 */
	private Runnable hideReservationMessageGroupEditList = new Runnable() {
		
		@Override
		public void run() {
			listViewReservationMessageGroupEditLayout.setVisibility(View.GONE);
			groupEditMode = false;
		}
	};
	 
	
	


//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// 확인창.

	/**
	 * 음성 메시지 전송 전 확인 창을 띄운다
	 * 
	 */
	private Runnable confirmSendReservationMessage = new Runnable() {
		@Override
		public void run() {

			Log.d(TAG,"confirmSendReservationMessage");
			new AlertDialog.Builder(SendMeReservationMessageListActivity.this)
			.setTitle("전송 확인")
			.setMessage("음성 메시지를 전송하시겠습니까?")
			.setNegativeButton("취소", new DialogInterface.OnClickListener() {

				@Override
				public void onClick(DialogInterface dialog, int which) {

				}
			})
			.setPositiveButton("확인", new DialogInterface.OnClickListener() {

				@Override
				public void onClick(DialogInterface dialog, int which) {
					threadUpdateDeliveryYn();
				}
			}).show();

		}
	};
	
	/**
	 * 음성 메시지 삭제전 확인 창을 띄운다
	 */
	private Runnable confirmDeleteAudio = new Runnable() {
		@Override
		public void run() {
			// selectedPosition
			
			new AlertDialog.Builder(SendMeReservationMessageListActivity.this)
			.setTitle("삭제 확인")
			.setMessage("음성 메시지를 삭제하시겠습니까?")
			.setNegativeButton("취소", new DialogInterface.OnClickListener() {

				@Override
				public void onClick(DialogInterface dialog, int which) {

				}
			})
			.setPositiveButton("확인", new DialogInterface.OnClickListener() {
				
				@Override
				public void onClick(DialogInterface dialog, int which) {
					threadUpdateDeactivate();
				}
			}).show();
			
		}
	};
	
	/**
	 * 그룹원 전체 삭제 불가 알림창을 띄운다
	 */
	private Runnable confirmCanNotDeleteGroupAll = new Runnable() {
		@Override
		public void run() {
			// selectedPosition
			
			new AlertDialog.Builder(SendMeReservationMessageListActivity.this)
			.setTitle("그룹원 삭제")
			.setMessage("전송 받을 사람이 최소 한명은 있어야 합니다.")
			.setNegativeButton("", new DialogInterface.OnClickListener() {
				@Override
				public void onClick(DialogInterface dialog, int which) {
				}
			})
			.setPositiveButton("확인", new DialogInterface.OnClickListener() {
				@Override
				public void onClick(DialogInterface dialog, int which) {
				}
			}).show();
			
		}
	};
	
	
	// 토스트
	/**
	 * 음성 메시지 전송에 성공했다는 toast 를 띄운다.
	 */
	public void showToastAudioSendSuccess() {					
		CharSequence text = "메시지가 전송 되었습니다";
		Toast toast = Toast.makeText(getApplicationContext(), text, Toast.LENGTH_SHORT);
		toast.setGravity(Gravity.CENTER_VERTICAL|Gravity.CENTER_HORIZONTAL, 0, 0);
		toast.show();
	}
	/**
	 * 음성 메시지 전송에 실패했다는 toast 를 띄운다.
	 */
	public void showToastAudioSendFail() {
		CharSequence text = "메시지 전송에 실패하였습니다";
		Toast toast = Toast.makeText(getApplicationContext(), text, Toast.LENGTH_SHORT);
		toast.setGravity(Gravity.CENTER_VERTICAL|Gravity.CENTER_HORIZONTAL, 0, 0);
		toast.show();
	}
	/**
	 *  음성 메시지 삭제에 성공했다는 toast 를 띄운다.
	 */
	public void showToastAudioDeleteSuccess() {
		CharSequence text = "음성 메시지가 삭제되었습니다.";
		Toast toast = Toast.makeText(getApplicationContext(), text, Toast.LENGTH_SHORT);
		toast.setGravity(Gravity.CENTER_VERTICAL|Gravity.CENTER_HORIZONTAL, 0, 0);
		toast.show();
	}
	/**
	 *  음성 메시지 삭제에 실패했다는 toast 를 띄운다.
	 */
	public void showToastAudioDeleteFail() {
		CharSequence text = "음성 메시지 삭제에 실패하였습니다.";
		Toast toast = Toast.makeText(getApplicationContext(), text, Toast.LENGTH_SHORT);
		toast.setGravity(Gravity.CENTER_VERTICAL|Gravity.CENTER_HORIZONTAL, 0, 0);
		toast.show();
	}
	
	
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// 리스트 슬라이드 기능 관련 

	@Override
	public void onScroll(AbsListView view, int firstVisibleItem,
			int visibleItemCount, int totalItemCount) {
		// TODO Auto-generated method stub

	}

	@Override
	public void onScrollStateChanged(AbsListView view, int scrollState) {
		// TODO Auto-generated method stub

	}

	@Override
	public ListView getListView() {
		return listViewReservationMessage;
	}

	@Override
	public void getSwipeItem(boolean isRight, int position) {
		// TODO Auto-generated method stub
		//밀면 우측 숨겨진 버튼이 보이도록 하기.
		if(isRight){		// 오른쪽으로 밀면 숨김
			// 바꿀 포지션(원본)
			for(int i=0; i<reservationMessageList.size(); i++){
				// 현재 필터링된 포지션. 같은걸 찾는다
				if(reservationMessageList.get(i).getIdSendMeVoice().equals(reservationMessageListFiltered.get(position).getIdSendMeVoice())){
					// 같은걸 찾아. 실제 위치값을 바꾼다..org.
					reservationMessageList.get(i).setShowDeleteBtnYn(false);	// isShowDeleteBtnYn	setShowDeleteBtnYn						
				}
			}
//			reservationMessageList.get(position).setShowDeleteBtnYn(false);	// isShowDeleteBtnYn	setShowDeleteBtnYn
		}else{				// 왼쪽으로 밀면 생김
			for(int i=0; i<reservationMessageList.size(); i++){
				// 현재 필터링된 포지션. 같은걸 찾는다
				if(reservationMessageList.get(i).getIdSendMeVoice().equals(reservationMessageListFiltered.get(position).getIdSendMeVoice())){
					// 같은걸 찾아. 실제 위치값을 바꾼다..org.
					reservationMessageList.get(i).setShowDeleteBtnYn(true);	// isShowDeleteBtnYn	setShowDeleteBtnYn						
				}
			}
//			reservationMessageList.get(position).setShowDeleteBtnYn(true);
		}
		sendMeReservationMessageAdapter.notifyDataSetChanged();
	}

	@Override
	public void onItemClickListener(ListAdapter adapter, int position) {
		// TODO Auto-generated method stub
	}


	
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

	// 리스트에 있는 버튼 클릭시 실행될 메소드

	// 재생 버튼 클릭시 파라미터를 세팅하여 예약 메시지 전용 재생 액티비티를 실행시킨다
	public void playAudioMessage(SendMeVoice sendMeVoice){
		
		Intent intent = new Intent(SendMeReservationMessageListActivity.this, SendMeAudioPlayForReservationMessageActivity.class);
//		SendMeVoice sendMeVoice = reservationMessageList.get(position);
		
		// receiver 전송을 위해 전번 정보 필요 x 재생을 위해 이름 표시를 위해서는 필요..o
//		String senderName = selectFriendNameFromPhoneBookAddressByPhoneNumber(sendMeVoice.getSender());	// -> receiverName
		intent.putExtra("idSendMeVoice", sendMeVoice.getIdSendMeVoice());		// o
		intent.putExtra("receiver", sendMeVoice.getReceiver());		// o
		intent.putExtra("receiverName", sendMeVoice.getReceiverName());		// o
		intent.putExtra("fileName", sendMeVoice.getFileName());		// o
		intent.putExtra("idSendMeFile", sendMeVoice.getIdSendMeFile());		// o

		startActivity(intent);
		
		// 화면을 닫는다.
		sendMeActivityManager.removeActivity(SendMeReservationMessageListActivity.this);
		finish();
	}

	// 전송 확인 받고 전송.
	public void sendAudioMessage(SendMeVoice sendMeVoice){
		selectedItem = sendMeVoice;
		mHandler.sendMessage(mHandler.obtainMessage(THREAD_CONFIRM_SEND_AUDIO));
	}

	// 삭제 버튼 클릭시 확인을 받고 목록에서 삭제 
	public void confirmDelete(SendMeVoice sendMeVoice){
		selectedItem = sendMeVoice;				
		mHandler.sendMessage(mHandler.obtainMessage(THREAD_CONFIRM_DELETE));		// 확인 후 삭제
	}
	
	/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
	// 서버 통신

	/**
	 * 예약 음성 메시지를 가져온다			selectUserReservationList
	 */
	public void threadSelectUserReservationList() {

		Log.d(TAG,"threadSelectUserReservationList");
		// 프로그레스 바를 출력 한다.
		mHandler.sendMessage(mHandler.obtainMessage(THREAD_PROGRESS_BAR_VISIBLE));

		Thread thread = new Thread(new Runnable() {

			public void run() {

				SendMeVoice sendMeVoice = new SendMeVoice();
				sendMeVoice.setSender(PHONE_NUMBER);			 
				sendMeVoice.setDeliveryYn("N");				
				sendMeVoice.setActivateYn("Y");		
//				parameterJsonObject.put("sender", sendMeVoice.getSender());					//	음성 메시지 보내는 사용자 휴대전화번호.	
//				parameterJsonObject.put("deliveryYn", sendMeVoice.getDeliveryYn());			//	발송 여부.('N')	
//				parameterJsonObject.put("activateYn", sendMeVoice.getActivateYn());			//	활성화 여부('Y')	
				SendMeAudioMessageRest sendMeAudioMessageRest = new SendMeAudioMessageRest();

				// 예약 메시지 목록		reservationMessageList
				ArrayList<SendMeVoice> resultReservationMessageList = null;		
				
				resultReservationMessageList = sendMeAudioMessageRest.selectUserReservationList(sendMeVoice);		// 원본 (정상 동작)
				
				reservationMessageList = new ArrayList<SendMeVoice>();
				
				
//				SendMeCommon sendMeCommon = new SendMeCommon();
//				ArrayList<SendMeFriend> phoneBookAddress = sendMeCommon.selectPhoneBookAddress(returnThis());
				
				// 전화번호부 전번,이름,닉네임,설치여부
				SendMeDBManagerInstallUser sendMeDBManagerInstallUser = new SendMeDBManagerInstallUser(returnThis());			
				ArrayList<SendMeFriend> phoneBookAddress = sendMeDBManagerInstallUser.selectInstallUserData();
				
				
				
				
				if(resultReservationMessageList!=null){
					for(int i=0; i<resultReservationMessageList.size(); i++){

						SendMeVoice reservationSendMeVoice = resultReservationMessageList.get(i);
						
						// 초기화. 내 전화번호부에 있는 대상이기 때문에 없을수는 없으나 만약 없다면 아답터에서 전번으로 출력해줌
						resultReservationMessageList.get(i).setReceiverName("");
						
						// 전화번호부와 동기화하여 이름 세팅
						for(int j=0; j<phoneBookAddress.size(); j++){

							// 번호가 같으면 전화번호부의 '이름'으로 세팅
							if(reservationSendMeVoice.getReceiver().equals(phoneBookAddress.get(j).getPhoneNumber())){
								reservationSendMeVoice.setReceiverName(phoneBookAddress.get(j).getName());
							}
						}
						reservationMessageList.add(reservationSendMeVoice);
					}
				}
				

				// 화면에 출력
				mHandler.sendMessage(mHandler.obtainMessage(THREAD_SHOW_RESERVATION_MESSAGE_LIST));	
				
				// 프로그레스 바를 감춘다.
				mHandler.sendMessage(mHandler.obtainMessage(THREAD_PROGRESS_BAR_INVISIBLE));
				
				
			}
		});
		thread.start();
	}
	
	/**
	 * 예약 메시지를 전송한다
	 */
	public void threadUpdateDeliveryYn() {
		
		// 프로그레스 바를 출력 한다.
		mHandler.sendMessage(mHandler.obtainMessage(THREAD_PROGRESS_BAR_VISIBLE));
		
		Thread thread = new Thread(new Runnable() {
			
			public void run() {
				Log.d(TAG,"threadUpdateDeliveryYn");
				SendMeCommon sendMeCommon = new SendMeCommon();
				String nowTime = sendMeCommon.getCurrentDate();
				
				SendMeAudioMessageRest sendMeAudioMessageRest = new SendMeAudioMessageRest();
				
				SendMeVoice sendMeVoice = new SendMeVoice();
				
//				sendMeVoice.setIdSendMeVoice(reservationMessageList.get(selectedPosition).getIdSendMeVoice());
				sendMeVoice.setIdSendMeVoice(selectedItem.getIdSendMeVoice());
				sendMeVoice.setDeliveryYn("Y");
				sendMeVoice.setActivateYn("Y");
				sendMeVoice.setModifyDate(nowTime);
//				idSendMeVoice : 음성 메시지 아이디.	
//				deliveryYn : 발송 여부('Y')	
//				activateYn : 활성화 여부('Y')	
//				modifyDate : 수정 일자.	
				SendMeVoice result = sendMeAudioMessageRest.updateDeliveryYn(sendMeVoice);
				
				if(result.getResult().equals("SUCCESS")){	
					mHandler.sendMessage(mHandler.obtainMessage(THREAD_TOAST_SEND_SUCCESS));
					
					// 서버 에서 리스트를 조회한다
					mHandler.sendMessage(mHandler.obtainMessage(THREAD_SELECT_RECEIVE_MESSAGE_LIST));	
				}else{
					mHandler.sendMessage(mHandler.obtainMessage(THREAD_TOAST_SEND_FAIL));
					
				}
				
				// 프로그레스 바를 감춘다.
				mHandler.sendMessage(mHandler.obtainMessage(THREAD_PROGRESS_BAR_INVISIBLE));
			}
		});
		thread.start();
	}
	
	
	/**
	 *  음성 메시지를 삭제한다	
	 *    받은 메시지를 서버에서 삭제한다. 성공시 목록 갱신
	 */
	public void threadUpdateDeactivate() {
		
		// 프로그레스 바를 출력 한다.
		mHandler.sendMessage(mHandler.obtainMessage(THREAD_PROGRESS_BAR_VISIBLE));
		
		Thread thread = new Thread(new Runnable() {
			
			public void run() {
				
				SendMeCommon sendMeCommon = new SendMeCommon();
				String nowTime = sendMeCommon.getCurrentDate();
				
				SendMeAudioMessageRest sendMeAudioMessageRest = new SendMeAudioMessageRest();
				
				SendMeVoice sendMeVoice = new SendMeVoice();
//				sendMeVoice.setIdSendMeVoice(reservationMessageList.get(selectedPosition).getIdSendMeVoice());
				sendMeVoice.setIdSendMeVoice(selectedItem.getIdSendMeVoice());
				sendMeVoice.setActivateYn("N");
				sendMeVoice.setModifyDate(nowTime);
				
				SendMeVoice result = sendMeAudioMessageRest.updateDeactivate(sendMeVoice);
					
				if(result.getResult().equals("SUCCESS")){		
					// "삭제 하였습니다."
					mHandler.sendMessage(mHandler.obtainMessage(THREAD_TOAST_RECEIVE_DELETE_SUCCESS));
					
					// 목록 갱신. // 서버 에서 리스트를 조회한다
					mHandler.sendMessage(mHandler.obtainMessage(THREAD_SELECT_RECEIVE_MESSAGE_LIST));	
				}else{
					// "삭제 실패했습니다."
					mHandler.sendMessage(mHandler.obtainMessage(THREAD_TOAST_RECEIVE_DELETE_FAIL));
				}
				
				// 프로그레스 바를 감춘다.
				mHandler.sendMessage(mHandler.obtainMessage(THREAD_PROGRESS_BAR_INVISIBLE));
			}
		});
		thread.start();
	}
	
	
	/**
	 * 예약 음성 메시지 그룹원 목록을 가져온다
	 */
	public void threadSelectUserList() {

		// 프로그레스 바를 출력 한다.
		mHandler.sendMessage(mHandler.obtainMessage(THREAD_PROGRESS_BAR_VISIBLE));

		Thread thread = new Thread(new Runnable() {

			public void run() {

				SendMeUser sendMeUser = new SendMeUser();
				sendMeUser.setActivateYn("Y");
				sendMeUser.setSendMeVoiceIdSendMeVoice(selectedMessageIdSendMeVoice);	
				sendMeUser.setSendMeVoiceSender(PHONE_NUMBER);
				Log.d(TAG,"selectedMessageIdSendMeVoice:"+selectedMessageIdSendMeVoice+"//PHONE_NUMBER:"+PHONE_NUMBER);
				SendMeUserRest sendMeUserRest = new SendMeUserRest();
				
				// 그룹원 리스트
				ArrayList<SendMeUser> resultSendMeUserList = null;	
				
				resultSendMeUserList = sendMeUserRest.selectUserList(sendMeUser);
				
				groupEditFriendList = new ArrayList<SendMeFriend>();
				
//				SendMeCommon sendMeCommon = new SendMeCommon();
//				ArrayList<SendMeFriend> phoneBookAddress = sendMeCommon.selectPhoneBookAddress(returnThis());
				SendMeDBManagerInstallUser sendMeDBManagerInstallUser = new SendMeDBManagerInstallUser(returnThis());			
				ArrayList<SendMeFriend> phoneBookAddress = sendMeDBManagerInstallUser.selectInstallUserData();
				
				if(resultSendMeUserList!=null){
					for(int i=0; i<resultSendMeUserList.size(); i++){
						
						SendMeFriend sendMeFriend = new SendMeFriend();
						sendMeFriend.setPhoneNumber(resultSendMeUserList.get(i).getReceiver());
						// 이름 초기화. 공백 또는 전화번호
						sendMeFriend.setName(resultSendMeUserList.get(i).getReceiver());
						
						// 전화번호부와 동기화하여 이름 세팅
						for(int j=0; j<phoneBookAddress.size(); j++){
							// 번호가 같으면 전화번호부의 이름으로 세팅
							if(sendMeFriend.getPhoneNumber().equals(phoneBookAddress.get(j).getPhoneNumber())){
								if(phoneBookAddress.get(j).getNickName().length()>0){
									sendMeFriend.setName(phoneBookAddress.get(j).getNickName());
								}else{
									sendMeFriend.setName(phoneBookAddress.get(j).getName());
								}
//								sendMeFriend.setName(phoneBookAddress.get(j).getName());
							}
						}
						groupEditFriendList.add(sendMeFriend);
					}
				}
				
					
				// 화면에 출력
				mHandler.sendMessage(mHandler.obtainMessage(THREAD_SHOW_RESERVATION_MESSAGE_GROUP_EDIT_LIST));	
				
				// 프로그레스 바를 감춘다.
				mHandler.sendMessage(mHandler.obtainMessage(THREAD_PROGRESS_BAR_INVISIBLE));
				
			}
		});
		thread.start();
	}
	
	
	/**
	 * 예약 음성 메시지의 수신자 목록을 업데이트 한다.
	 */
	public void threadUpdateReservationUserList() {

		// 프로그레스 바를 출력 한다.
		mHandler.sendMessage(mHandler.obtainMessage(THREAD_PROGRESS_BAR_VISIBLE));

		Thread thread = new Thread(new Runnable() {

			public void run() {


				SendMeCommon sendMeCommon = new SendMeCommon();
				String nowTime = sendMeCommon.getCurrentDate();
				
				SendMeUserRest sendMeUserRest = new SendMeUserRest();
				List<SendMeUser> sendMeUserList = new ArrayList<SendMeUser>();
				
				JSONArray parameterJsonArray = new JSONArray();
				
				try{
					for(int i=0; i<groupEditFriendList.size(); i++){
						if(!(groupEditFriendList.get(i).getIsSelectedForSend())){		// 선택된건 삭제니까 제외시키고 선택되지 않은 목록만 전송
							JSONObject parameterJsonObject = new JSONObject();
							
							parameterJsonObject.put("receiver", groupEditFriendList.get(i).getPhoneNumber());
							parameterJsonObject.put("activateYn", "Y");
							parameterJsonObject.put("modifyDate", nowTime);
							parameterJsonObject.put("registerDate", nowTime);
							parameterJsonObject.put("sendMeVoiceIdSendMeVoice", selectedMessageIdSendMeVoice);
							parameterJsonObject.put("sendMeVoiceSender", PHONE_NUMBER);
							
//							parameterJsonArray.put(parameterJsonObject.toString());			// err
							parameterJsonArray.put(parameterJsonObject);					// ok
						}
					}
					
					SendMeUser sendMeUser = new SendMeUser();
					sendMeUser.setActivateYn("Y");
					sendMeUser.setSendMeVoiceIdSendMeVoice(selectedMessageIdSendMeVoice);
					sendMeUser.setSendMeVoiceSender(PHONE_NUMBER);
					sendMeUser.setReceiverList(parameterJsonArray.toString());
					
					SendMeUser result = sendMeUserRest.updateReservationUserList(sendMeUser);
					if(result.getResult().equals("SUCCESS")){
						Log.d(TAG,"S");
					}else{
						Log.d(TAG,"F");
					}
					// 그룹창을 닫는다
					mHandler.sendMessage(mHandler.obtainMessage(THREAD_HIDE_RESERVATION_MESSAGE_GROUP_EDIT_LIST));
					
					// 프로그레스 바를 감춘다.
					mHandler.sendMessage(mHandler.obtainMessage(THREAD_PROGRESS_BAR_INVISIBLE));
					
					// 재조회
					mHandler.sendMessage(mHandler.obtainMessage(THREAD_SELECT_RECEIVE_MESSAGE_LIST));
					
				}catch (Exception e){
					e.printStackTrace();
				}
				

				
				
				
//				for(int i=0; i<sendMeUserList.size(); i++){
//					
//					SendMeUser sendMeUser = sendMeUserList.get(i);
//					
//					JSONObject parameterJsonObject = new JSONObject();
//					
//					parameterJsonObject.put("activateYn", sendMeUser.getActivateYn());
//					parameterJsonObject.put("modifyDate", sendMeUser.getModifyDate());
//					parameterJsonObject.put("registerDate", sendMeUser.getRegisterDate());
//					
//					parameterJsonObject.put("sendMeVoiceIdSendMeVoice", sendMeUser.getSendMeVoiceIdSendMeVoice());
//					parameterJsonObject.put("sendMeVoiceSender", sendMeUser.getSendMeVoiceSender());
//					parameterJsonObject.put("receiverList", sendMeUser.getReceiver());
//					
////					try {
////						JSONObject parameterJsonObject = new JSONObject();
////						parameterJsonObject.put("activateYn", sendMeUser.getActivateYn());
////						parameterJsonObject.put("modifyDate", nowTime);
////						parameterJsonObject.put("registerDate", nowTime);
////						parameterJsonObject.put("sendMeVoiceIdSendMeVoice", sendMeUser.getSendMeVoiceIdSendMeVoice());
////						parameterJsonObject.put("sendMeVoiceSender", sendMeUser.getSendMeVoiceSender());
////						parameterJsonObject.put("receiverList", sendMeUser.getReceiver());
////						
////						JSONObject resultJsonObject = new JSONObject(this.requestToServer(url, parameterJsonObject.toString()));
////						result.setResult(resultJsonObject.getString("result"));
////					} catch(Exception e) {
////						e.printStackTrace();
////					}				
//					parameterJsonArray.put(parameterJsonObject.toString());		 // jsonArray 에 jsonObject 를 담아서 서버로 리스트를 보낼때는 jsonObject 그대로 넣지 않고 toString() 으로 변환하여 담는다				
//				}
				
				
			}
		});
		thread.start();
	}
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	/**
	 * 로그를 남긴다	 
	 */
	public void threadRegisterLog() {
		Thread thread = new Thread(new Runnable() {
			public void run() {
				
				SendMeCommon sendMeCommon = new SendMeCommon();
				String nowTime = sendMeCommon.getCurrentDate();
				
				SendMeLog sendMeLog = new SendMeLog();
				sendMeLog.setPhoneNumber(PHONE_NUMBER);
				sendMeLog.setViewName(TAG);
				sendMeLog.setRegisterDate(nowTime);
				
				SendMeLogRest sendMeLogRest = new SendMeLogRest();
				
				sendMeLogRest.registerLog(sendMeLog);
			}
		});
		thread.start();
	}
	
	/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////


	/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////	

	@Override
	public void onResume(){
		super.onResume();
		
		dialog = ProgressDialog.show(SendMeReservationMessageListActivity.this, "", "Load..", true);
		dialog.hide();
		
		
		// 서버 에서 리스트를 조회한다
		mHandler.sendMessage(mHandler.obtainMessage(THREAD_SELECT_RECEIVE_MESSAGE_LIST));	
	}
	
	
	// 컨텍스트 반환
	public Context returnThis() {
		return this;
	}


	/**
	 * SharedPreference 정보를 확인 한다.
	 */
	public void confirmNotification() {
		SharedPreferences mSharedPreference = getSharedPreferences(SendMeConstant.SENDME_PREFERENCE, Activity.MODE_PRIVATE);

		MASTER_PASSWORD = mSharedPreference.getString("master_password", "");
		PUBLIC_PASSWORD = mSharedPreference.getString("public_password", "");
		FUNCTION_MODE = mSharedPreference.getString("function_mode", "");
		PHONE_NUMBER = mSharedPreference.getString("phone_number", "");
	}

	/**
	 * 뒤로 가기 버튼을 정의 한다.
	 * 화면을 종료 한다.
	 */
	@Override
	public void onBackPressed() {
		
		if(groupEditMode){
			listViewReservationMessageGroupEditLayout.setVisibility(View.GONE);
			groupEditMode = false;
		}else{
			// TODO Auto-generated method stub
			sendMeActivityManager.removeActivity(this);
			finish();
		}
	}

	
	@Override
	public void onStop(){
		super.onStop();
		dialog.dismiss();
	}
	
	
	
}